package facade

import "fmt"

func NewAPI() API {
	return &apiImpl{
		a: NewAModuleAPI(),
		b: NewBModuleAPI(),
	}
}

type API interface {
	Test() string
}


type apiImpl struct {
	a AModuleAPI
	b BModuleAPI
}

func (a *apiImpl) Test() string {
	aRet := a.a.TestA()
	bRet := a.b.TestB()
	return fmt.Sprintf("%s\n%s", aRet, bRet)
}


func NewAModuleAPI() AModuleAPI { // 创建器
	return &aModuleImpl{}
}


type AModuleAPI interface { // 接口
	TestA() string
}

type aModuleImpl struct{} // 实现

func (*aModuleImpl) TestA() string {
	return "A module running"
}


func NewBModuleAPI() BModuleAPI { // 创建器
	return &bModuleImpl{}
}


type BModuleAPI interface { // 接口
	TestB() string
}

type bModuleImpl struct{} // 实现

func (*bModuleImpl) TestB() string {
	return "B module running"
}
